package main

import (
	"flag"
	"fmt"
	"io"
	"os"
	"path/filepath"
)

func main1111133() {
	// 获取当前工作目录作为默认值
	currentDir, err := os.Getwd()
	if err != nil {
		fmt.Printf("警告: 无法获取当前工作目录: %v\n", err)
		currentDir = "."
	}
	currentDir = `D:\\code\\go\\gozrd-admin-api\\internal\\entity`

	// 定义命令行参数，设置默认值
	inputDir := flag.String("dir", currentDir, "输入目录路径 (默认: 当前目录)")
	outputFile := flag.String("out", "read_data.txt", "输出文件路径 (默认: read_data.txt)")
	flag.Parse()

	// 确保输入目录存在
	info, err := os.Stat(*inputDir)
	if err != nil {
		fmt.Printf("错误: 无法访问输入目录 '%s': %v\n", *inputDir, err)
		os.Exit(1)
	}
	if !info.IsDir() {
		fmt.Printf("错误: '%s' 不是一个目录\n", *inputDir)
		os.Exit(1)
	}

	// 创建或清空输出文件
	outFile, err := os.Create(*outputFile)
	if err != nil {
		fmt.Printf("错误: 无法创建输出文件 '%s': %v\n", *outputFile, err)
		os.Exit(1)
	}
	defer outFile.Close()

	// 计数器
	fileCount := 0
	totalBytes := int64(0)

	fmt.Printf("开始处理目录: %s\n", *inputDir)
	fmt.Printf("输出文件: %s\n\n", *outputFile)

	// 遍历目录
	err = filepath.Walk(*inputDir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			fmt.Printf("警告: 访问 '%s' 时出错: %v\n", path, err)
			return nil // 继续处理其他文件
		}

		// 跳过目录
		if info.IsDir() {
			return nil
		}

		// 跳过输出文件本身，防止无限增长
		absOutPath, _ := filepath.Abs(*outputFile)
		absPath, _ := filepath.Abs(path)
		if absOutPath == absPath {
			fmt.Printf("跳过输出文件: %s\n", path)
			return nil
		}

		// 读取并写入文件内容
		relPath, _ := filepath.Rel(*inputDir, path)

		// 获取文件的绝对路径
		absPath, err = filepath.Abs(path)
		if err != nil {
			absPath = path // 如果获取绝对路径失败，使用原始路径
		}

		// 写入文件头部信息（使用绝对路径）
		//header := fmt.Sprintf("\n\n===== 文件: %s =====\n\n", absPath)
		//outFile.WriteString(header)

		// 打开源文件
		file, err := os.Open(path)
		if err != nil {
			fmt.Printf("警告: 无法打开文件 '%s': %v\n", path, err)
			return nil // 继续处理其他文件
		}
		defer file.Close()

		// 复制文件内容
		written, err := io.Copy(outFile, file)
		if err != nil {
			fmt.Printf("警告: 读取文件 '%s' 时出错: %v\n", path, err)
			return nil
		}

		fileCount++
		totalBytes += written
		fmt.Printf("处理文件: %s (%d 字节)\n", relPath, written)

		return nil
	})

	if err != nil {
		fmt.Printf("错误: 遍历目录时出错: %v\n", err)
		os.Exit(1)
	}

	fmt.Printf("\n完成! 合并了 %d 个文件，总共 %d 字节到 '%s'\n", fileCount, totalBytes, *outputFile)
}
